// 给定一个包含非负整数的 m x n 网格 grid ，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。

// 说明：每次只能向下或者向右移动一步。

// 执行用时：
// 12 ms
// , 在所有 C++ 提交中击败了
// 49.18%
// 的用户
// 内存消耗：
// 9.7 MB
// , 在所有 C++ 提交中击败了
// 60.06%
// 的用户

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_map>
#include<set>
using namespace std;

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        vector<vector<int>> dp(grid.size(),vector<int>(grid[0].size()));
        dp[0][0] = grid[grid.size()-1][grid[0].size()-1];
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if(i==0 && j==0){
                    continue;
                }
                else if(i==0 && j!=0){
                    dp[i][j] = dp[i][j-1]+grid[grid.size()-1-i][grid[0].size()-1-j];
                }
                else if(i!=0 && j==0){
                    dp[i][j] = dp[i-1][j]+grid[grid.size()-1-i][grid[0].size()-1-j];
                }
                else{
                    dp[i][j] = min(dp[i-1][j]+grid[grid.size()-1-i][grid[0].size()-1-j],dp[i][j-1]+grid[grid.size()-1-i][grid[0].size()-1-j]);
                }
            }
        }
        return dp[grid.size()-1][grid[0].size()-1];
    }
};